home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 23
/
Amiga Format AFCD23 (Feb 1998, Issue 107).iso
/
-seriously_amiga-
/
shareware
/
programming
/
c
/
asyncio
/
src
/
fgetslenasync.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-12-01
|
2KB
|
101 lines
#include "async.h"
_LIBCALL APTR
FGetsLenAsync( _REG( a0 ) AsyncFile *file, _REG( a1 ) APTR buf,
_REG( d0 ) LONG numBytes, _REG( a2 ) LONG *len )
{
UBYTE *p;
LONG length = 0;
p = ( UBYTE * ) buf;
/* Make room for \n and \0 */
if( --numBytes <= 0 )
{
/* Handle senseless cases */
return( NULL );
}
while( TRUE )
{
UBYTE *ptr;
LONG i, count;
ptr = ( UBYTE * ) file->af_Offset;
if( count = file->af_BytesLeft )
{
count = MIN( count, numBytes );
for( i = 0; ( i < count ) && ( *ptr != '\n' ); ++i )
{
*p++ = *ptr++;
}
length += i;
/* Check for valid EOL char */
if( i < count )
{
/* MH: Since i < count, and count <= numBytes,
* there _is_ room for \n\0.
*/
*p++ = '\n'; /* "Read" EOL char */
++i;
length += 1;
}
file->af_BytesLeft -= i;
file->af_Offset += i;
if( ( i >= numBytes ) || ( *( p - 1 ) == '\n' ) )
{
/* MH: It is enough to break out of the loop.
* no need to "waste" code by making a special
* exit here. ;)
*/
break;
}
numBytes -= i;
}
/* MH: numBytes must be at least 1 here, so there is still room
* for \n\0, in case we read \n.
*/
if( ReadAsync( file, p, 1 ) < 1 )
{
break;
}
--numBytes;
++length;
if( *p++ == '\n' )
{
break;
}
}
*p = '\0';
*len = length;
if( p == ( UBYTE * ) buf )
{
return( NULL );
}
return( buf );
}
_CALL APTR
FGetsAsync( _REG( a0 ) AsyncFile *file, _REG( a1 ) APTR buf, _REG( d0 ) LONG numBytes )
{
LONG len;
return( FGetsLenAsync( file, buf, numBytes, &len ) );
}